# 公司：安徽银杰
# 作者：李伟
"""
re： 库  内置库，不需要安装 直接导入使用  正则的库

findall(正则表达式，目标字符串)
- 从目标字符串从头到尾去匹配 正则表达式，主要符合规则的就会拿出来
- 拿出来数据存在列表里  结果是列表 []

拿到这个prodId  skuId 变量名 去环境变量类里查找一下 有没有属性
- 如果有这个属性，替换 '#prodId#'---> 属性值
- 没有属性 不替换。

找到这个占位符##的位置。替换为环境变量数据：
1、先判断一下这个正则查找的结果列表是否为空
   - 为空 不需要替换
   - 不为空 才会替换
2、for循环遍历这个列表里的变量名
3、判断这个变量名是否存在环境变量的属性名 【类里是否有这个属性】
   -- hasattr(类/对象，"属性名") 结果是布尔值，有-True  没有-False
4、如果有这个属性 替换属性值 ---> #prodId#， 字符串的替换 replace方法
   - replace（old，new）  必须是字符串的类型，如果不是字符串类型，用str()转化
   - old是 #prodId#
   - new是属性值： getattr(类/对象，"属性名")
   - replace方法是生成新的字符串

"""
#
# import re
#
# #环境变量
# class EnviData:
#     prodId=123
#     skuId=456
#
# #查找占位符的字段
#
# str_data = '{"basketId": 0, "count": 1111, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}' #excel提取的请求参数
# result = re.findall("#.*?#",str_data) #findall(正则表达式，目标字符串)
# # print(result)  # 结果是['#prodId#', '#skuId#']   正则匹配后的数据以列表的格式进行保存。
#
# # 单独拿到变量名本身--左边界（提取出值）右边界
# result = re.findall("#(.*?)#",str_data)
# # print(result)  # 结果是['prodId', 'skuId']
#
# #1、先判断一下这个正则查找的结果列表是否为空
# if result:#如果列表非空
#     # 2、for循环这个列表里的变量名
#     for mark in result:
#         #3、判断这个变量名是否存在环境变量的属性名【类里面是否有这个属性】
#         if hasattr(EnviData,mark):
#             #4、如果有这个属性，则替换属性值
#             str_data = str_data.replace(f"#{mark}#",str(getattr(EnviData,mark)))# 转化为字符串类型.
#             # mark 变量名本身 ：#Mark#:变量属性值 如果有属性值那么str(getattr(EnviData,mark)获取新变量指标后 替换原来的#Mark# 变量值。
# # print(str_data)  #打印出返回替换后的环境变量值。
#
# if __name__ == '__main__':
#     print(getattr(EnviData,"prodId")) #整型


# 封装
# ①正则匹配判断是否为空
# ②循环遍历变量名
# ③查询变量名在环境变量中是否有对应的属性值。
# ④替换属性值。
class EnviData:
    prodId = 123
    skuId = 456

import re
from tools.handle_logs import logger
def replace_data(str_data):
    if str_data is None:
        logger.info("......无需替换......")
        return
    #正则匹配目标字符串中的占位符。这里直接查找并转换占位符本身的变量名#（.*？）#
    logger.info("。。。。开始替换。。。。。")
    result = re.findall("#(.*?)#",str_data)
    if result:#非空
        for mark in result:
            if hasattr(EnviData,mark):
                str_data = str_data.replace(f"#{mark}#",str(getattr(EnviData,mark)))
    else:
        logger.info(f"要替换的占位符为空{result}不需要替换")
    logger.info(f"环境变量替换后的数据{str_data}")
    return str_data

if __name__ == '__main__':

    str_data = '{"basketId": 0, "count": 1111, "prodId": #prodId#, "shopId": 1, "skuId": #skuId#}'
    print(replace_data(str_data))